package cn.biplam.common.paramters;

import cn.biplam.common.tools.DEBUG;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.KvMap;

/**
 * 持久化类,用于存储持久化数据KvMap<String,KvMap<String,Object>>
 * 
 * @author WangSong 2009-6-23上午11:08:46
 * @version 1.0
 */
public class PersisParam {
	
	/** KvMap<userId,KvMap<pageId,KvMap<operatorId,Object>>>*/
	private static KvMap<String,KvMap<String,KvMap<String,Object>>> persisParams;
	
	/**
	 * 设置持久化对象
	 * @param userId 用户ID
	 * @param pageId 单层持久化主页面容器id或多层持久化顶层主页面的容器id
	 * @param optId  operator层持久化类的交换码id
	 * @param param 需要持久化的参数
	 * @throws ErrorMessage 
	 */
	public static void set(String userId,String pageId, String optId,Object param) throws ErrorMessage{
		set(userId, pageId, optId, null, param);
	}
	
	/**
	 * 设置持久化对象
	 * @param userId 用户ID
	 * @param pageId 单层持久化主页面容器id或多层持久化顶层主页面的容器id
	 * @param optId  operator层持久化类的交换码id
	 * @param persisId 用自定义持久化id来持久化对象
	 * @param param 需要持久化的参数
	 * @throws ErrorMessage 
	 */
	@SuppressWarnings("unchecked")
	public static void set(String userId,String pageId, String optId,String persisId,Object param) throws ErrorMessage{
		if(persisParams==null){
			persisParams = new KvMap<String,KvMap<String,KvMap<String,Object>>>();
		}
		/**取用户下的持久层数据*/
		KvMap<String,KvMap<String,Object>> paramU = persisParams.getByKey(userId);
		if(paramU==null){
			paramU = new KvMap<String,KvMap<String,Object>>();
			persisParams.put(userId, paramU);
		}
		/**取operatorId下的持久层数据*/
		KvMap<String,Object> paramO =  paramU.getByKey(pageId);
		if(paramO == null){
			paramO = new KvMap<String,Object>();
			paramU.put(pageId, paramO);	
		}
		if(persisId!=null){
			KvMap<String,Object> persisOpt = null;
			try{
				//向下转型，先判断类型
				if(objectIsKvMap(paramO.getByKey(optId))){
					persisOpt = (KvMap<String,Object>)paramO.getByKey(optId);
				}
			}catch(Exception e){
				DEBUG.println("PersisParam.java,persisId object error!");
			}
			if(persisOpt==null){
				persisOpt = new KvMap<String, Object>();
			}
			persisOpt.put(persisId, param);
			paramO.put(optId, persisOpt);
		}else{
			paramO.put(optId, param);
		}
	}
	
	/**
	 * 取持久化对象
	 * @param userId 用户ID
	 * @param pageId 单层持久化主页面容器id或多层持久化顶层主页面的容器id
	 * @param optId  operator层持久化类的交换码id
	 */
	public static Object get(String userId,String pageId,String optId){
		return get(userId, pageId, optId,null);
	}
	
	/**
	 * 取持久化对象
	 * @param userId 用户ID
	 * @param pageId 单层持久化主页面容器id或多层持久化顶层主页面的容器id
	 * @param optId  operator层持久化类的交换码id
	 */
	@SuppressWarnings("unchecked")
	public static Object get(String userId,String pageId,String optId,String persisId){
	    
		Object param = null;
		if(persisParams!=null && 
				persisParams.getByKey(userId)!=null &&
				persisParams.getByKey(userId).getByKey(pageId)!=null){
			if(persisId!=null){
				/**判断持久层persisId持久容器是否为空。如果不为空，且取得的容器时kvMap,则不为空.*/
				if(persisParams.getByKey(userId).getByKey(pageId).getByKey(optId)!=null &&
	                     objectIsKvMap(persisParams.getByKey(userId).getByKey(pageId).getByKey(optId))){
					param = ((KvMap<String,Object>)persisParams.getByKey(userId)
		                     .getByKey(pageId).getByKey(optId)).getByKey(persisId);
				}	
			}else{
				param = persisParams.getByKey(userId).getByKey(pageId).getByKey(optId);
			}
		}
		return param;
	}
	
	/**
	 * 清除用户下的持久化对象
	 * @param userId 用户id
	 */
	public static void clear(String userId){
		if(persisParams!=null && 
				persisParams.getByKey(userId)!=null){
			persisParams.removeByKey(userId);
		}
	}
	
	/**
	 * 清除用户的，页面下的持久化对象
	 * @param userId 用户id
	 * @param pageId 页面id
	 */
	public static void clear(String userId,String pageId){
		if(persisParams!=null && 
				persisParams.getByKey(userId)!=null &&
				persisParams.getByKey(userId).getByKey(pageId)!=null){
			persisParams.getByKey(userId).removeByKey(pageId);
		}
	}
	
	/**
	 * 清除除用户的，页面下的，操作id下的持久化对象
	 * @param userId 用户id
	 * @param pageId 页面id
	 * @param optId  操作id
	 */
	public static void clear(String userId,String pageId,String optId){
		if(persisParams!=null && 
				persisParams.getByKey(userId)!=null &&
				persisParams.getByKey(userId).getByKey(pageId)!=null &&
				persisParams.getByKey(userId).getByKey(pageId).getByKey(optId)!=null){
			persisParams.getByKey(userId).getByKey(pageId).removeByKey(optId);
		}
	}
	
	/**
	 * 清除除用户的，页面下的，操作id下的持久化对象
	 * @param userId 用户id
	 * @param pageId 页面id
	 * @param optId  操作id
	 * @param persistId 持久化id
	 */
	@SuppressWarnings("unchecked")
	public static void clear(String userId,String pageId,String optId,String persistId){
		if(persisParams!=null && 
				persisParams.getByKey(userId)!=null &&
				persisParams.getByKey(userId).getByKey(pageId)!=null &&
				persisParams.getByKey(userId).getByKey(pageId).getByKey(optId)!=null &&
				((KvMap<String,String>)persisParams.getByKey(userId).getByKey(pageId).getByKey(optId)).getByKey(persistId)!=null){
			((KvMap<String,String>)persisParams.getByKey(userId).getByKey(pageId).getByKey(optId)).removeByKey(persistId);
		}
	}
	
	/**
	 * 
	 * 缓存类型
	 */
	public enum Cache_Type{
		/** 清空当前pageId下的缓存，重新从数据库取数据到缓存*/
		Refresh,
		/** 直接从缓存取数据(如缓存为空，从数据库取数据放到缓存中)*/
		Lazy;
	}
	
	/**
	 * 判断对象是否是kvmap对象
	 * @param obj 
	 * @return
	 */
	private static boolean objectIsKvMap(Object obj){
		if(obj==null){
			return true;
		}else if(obj instanceof KvMap){
			return true;
		}else{
			return false;
		}
	}
	
//	/**
//	 * 判断对象是否是OperatorResult对象
//	 * @param obj 
//	 * @return
//	 */
//	private static boolean objectIsOperatorResult(Object obj){
//		if(obj==null){
//			return true;
//		}else if(obj instanceof OperatorResult){
//			return true;
//		}else{
//			return false;
//		}
//	}
}
